#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const sqlite3 = require('sqlite3').verbose();

// 颜色输出
const colors = {
  red: '\033[31m',
  green: '\033[32m',
  yellow: '\033[33m',
  blue: '\033[34m',
  reset: '\033[0m'
};

function log(message, color = 'reset') {
  console.log(`${colors[color]}${message}${colors.reset}`);
}

function logSuccess(message) { log(`✅ ${message}`, 'green'); }
function logWarning(message) { log(`⚠️  ${message}`, 'yellow'); }
function logError(message) { log(`❌ ${message}`, 'red'); }
function logInfo(message) { log(`ℹ️  ${message}`, 'blue'); }

// 需要保留的文件（默认资源）
const KEEP_FILES = [
  'wechat-group-qr.svg',
  'wechat-official-qr.svg'
];

// 清理上传的图片文件
function cleanUploadedFiles() {
  logInfo('清理上传的测试图片...');
  
  const uploadDirs = [
    path.join(__dirname, '../public/uploads'),
    path.join(__dirname, '../uploads')
  ];
  
  let totalDeleted = 0;
  
  uploadDirs.forEach(dir => {
    if (!fs.existsSync(dir)) {
      logWarning(`目录不存在: ${dir}`);
      return;
    }
    
    const files = fs.readdirSync(dir);
    files.forEach(file => {
      if (!KEEP_FILES.includes(file)) {
        const filePath = path.join(dir, file);
        try {
          fs.unlinkSync(filePath);
          logSuccess(`删除文件: ${file}`);
          totalDeleted++;
        } catch (error) {
          logError(`删除文件失败: ${file} - ${error.message}`);
        }
      } else {
        logInfo(`保留默认文件: ${file}`);
      }
    });
  });
  
  logSuccess(`共删除 ${totalDeleted} 个测试图片文件`);
}

// 清理数据库中的测试数据
function cleanDatabase() {
  return new Promise((resolve, reject) => {
    logInfo('清理数据库中的测试数据...');
    
    const dbPath = path.join(__dirname, '../data/database.sqlite');
    
    if (!fs.existsSync(dbPath)) {
      logWarning('数据库文件不存在，跳过数据库清理');
      resolve();
      return;
    }
    
    const db = new sqlite3.Database(dbPath);
    
    // 清理步骤
    const cleanupSteps = [
      // 清理新闻数据
      { sql: 'DELETE FROM news', description: '清理测试新闻' },
      // 清理媒体文件记录
      { sql: 'DELETE FROM media_files', description: '清理媒体文件记录' },
      // 清理招新信息
      { sql: 'DELETE FROM recruitments', description: '清理招新信息' },
      // 清理申请记录
      { sql: 'DELETE FROM applications', description: '清理申请记录' },
      // 清理成员信息（可选）
      { sql: 'DELETE FROM members WHERE id != "admin"', description: '清理测试成员' },
      // 重置自增ID
      { sql: 'DELETE FROM sqlite_sequence', description: '重置自增序列' }
    ];
    
    let completed = 0;
    
    cleanupSteps.forEach(step => {
      db.run(step.sql, function(err) {
        if (err) {
          logError(`${step.description}失败: ${err.message}`);
        } else {
          logSuccess(`${step.description}: 删除了 ${this.changes} 条记录`);
        }
        
        completed++;
        if (completed === cleanupSteps.length) {
          db.close((err) => {
            if (err) {
              logError('关闭数据库连接失败');
              reject(err);
            } else {
              logSuccess('数据库清理完成');
              resolve();
            }
          });
        }
      });
    });
  });
}

// 清理日志和临时文件
function cleanTempFiles() {
  logInfo('清理临时文件和日志...');
  
  const tempDirs = [
    path.join(__dirname, '../logs'),
    path.join(__dirname, '../.next'),
    path.join(__dirname, '../backups')
  ];
  
  tempDirs.forEach(dir => {
    if (fs.existsSync(dir)) {
      try {
        fs.rmSync(dir, { recursive: true, force: true });
        logSuccess(`删除目录: ${path.basename(dir)}`);
      } catch (error) {
        logError(`删除目录失败: ${path.basename(dir)} - ${error.message}`);
      }
    }
  });
}

// 创建生产环境初始数据
function createInitialData() {
  logInfo('创建生产环境初始数据...');
  
  return new Promise((resolve, reject) => {
    const dbPath = path.join(__dirname, '../data/database.sqlite');
    const db = new sqlite3.Database(dbPath);
    
    // 插入示例新闻（可选）
    const initialNews = `
      INSERT INTO news (
        id, title, summary, content, category, author, 
        publish_date, is_published, is_pinned
      ) VALUES (
        'welcome-news',
        '欢迎访问机器人创新实验室',
        '这里是实验室的官方网站，我们致力于机器人技术的研发与创新。',
        '<p>欢迎来到机器人创新实验室！</p><p>我们是一个专注于机器人技术研发与创新的团队。在这里，您可以了解我们的最新研究成果、团队成员信息，以及如何加入我们的大家庭。</p><p>如有任何疑问，请随时通过我们的联系方式与我们取得联系。</p>',
        'announcement',
        '管理员',
        datetime('now'),
        1,
        1
      )
    `;
    
    db.run(initialNews, function(err) {
      if (err) {
        logWarning('创建初始新闻失败: ' + err.message);
      } else {
        logSuccess('创建初始新闻成功');
      }
      
      db.close();
      resolve();
    });
  });
}

// 显示部署前检查清单
function showDeploymentChecklist() {
  logInfo('\n📋 部署前检查清单:');
  console.log(`
${colors.yellow}必需检查项目:${colors.reset}
□ 确认 .env.production 中的密码已修改
□ 确认域名配置正确
□ 确认数据库连接配置
□ 测试轮播功能是否正常
□ 测试后台管理登录功能
□ 确认SSL证书配置（如需要）

${colors.yellow}可选检查项目:${colors.reset}
□ 添加初始联系方式信息
□ 上传公司Logo和Favicon
□ 配置主题颜色
□ 设置轮播参数
□ 添加初始团队成员信息

${colors.green}部署命令:${colors.reset}
1. 上传项目到服务器
2. 运行: chmod +x deploy.sh
3. 运行: ./deploy.sh deploy
4. 访问: http://your-domain.com/admin 测试后台
`);
}

// 主函数
async function main() {
  log('\n🚀 开始清理项目以准备部署...', 'blue');
  
  try {
    // 1. 清理上传文件
    cleanUploadedFiles();
    
    // 2. 清理数据库
    await cleanDatabase();
    
    // 3. 清理临时文件
    cleanTempFiles();
    
    // 4. 创建初始数据
    await createInitialData();
    
    log('\n✨ 清理完成！项目已准备好用于部署。', 'green');
    
    // 5. 显示部署检查清单
    showDeploymentChecklist();
    
  } catch (error) {
    logError('清理过程中出现错误: ' + error.message);
    process.exit(1);
  }
}

// 添加确认提示
function confirmCleanup() {
  const readline = require('readline');
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });

  return new Promise((resolve) => {
    log('\n⚠️  警告: 此操作将删除所有测试数据，包括:', 'yellow');
    log('   • 所有测试新闻和内容', 'yellow');
    log('   • 所有上传的测试图片', 'yellow');
    log('   • 所有测试成员和申请记录', 'yellow');
    log('   • 构建文件和日志', 'yellow');
    
    rl.question('\n确定要继续吗？(y/N): ', (answer) => {
      rl.close();
      if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
        resolve(true);
      } else {
        log('操作已取消', 'yellow');
        resolve(false);
      }
    });
  });
}

// 运行脚本
(async () => {
  const confirmed = await confirmCleanup();
  if (confirmed) {
    await main();
  }
})();